<?php 
/* --------------------------------
 *  Модуль отправки СМС 
 * 
 * 31.05.2012
 * © Deemon 
 --------------------------------*/
class sms extends Load_use
{
	function getAction()
	{
		if(isset($params['message'])&&isset($params['phone_num']))
		{
			$mess=trim($params['message']);
			$num=trim($params['phone_num']);
			if($mess!='' && $num!='')
			{
				$mess1=mysql_escape_string($mess);
				$num1=mysql_escape_string($num);
				$insId=$this->conn->query("insert into sms (dateCreate,num,senderId,mess) values(now(),'$num1',{$this->user->id},'$mess1')",true);
				if($insId)
					//if(soc('snd',$insId,$num,$mess))//\tmp
						return true;
			}
			
		}
		
		return false;
	}
	
	
	function soc($type,$insId,$num=false,$mess=false,&$err=false)
	{
		{static $smsErr=array(//Ошибки отправки
		'1'=>'Ошибка в параметрах. ',
		'2'=>'Неверный логин или пароль. ',
		'3'=>'Недостаточно средств на счету Клиента. ',
		'4'=>'IP-адрес временно заблокирован. ',
		'5'=>'Неверный формат даты. ',
		'6'=>'Сообщение запрещено. ',
		'7'=>'Неверный формат номера телефона. ',
		'8'=>'Сообщение на указанный номер не может быть доставлено. ',
		'9'=>'Попытка отправки более двух одинаковых запросов в течение минуты.'
		);}
		{static $smsGetErr=array(//Ошибки проверки статуса
		'1'=>'Ошибка в параметрах. ',
		'2'=>'Неверный логин или пароль. ',
		'3'=>'Сообщение не найдено.'
		);}
		{static $smsGetStatuse=array(//Статус сообщения
		'-1'=>'Ожидает в очереди (если при отправке сообщения было задано время получения абонентом, то до этого времени сообщение будет находиться в данном статусе, в других случаях сообщение в этом статусе находится непродолжительное время перед отправкой на SMS-центр). ',
		'0'=>'Передано оператору (сообщение было передано на SMS-центр для доставки). ',
		'1'=>'Доставлено (сообщение было успешно доставлено абоненту). ',
		'2'=>'Статус не получен (в течение суток статус доставки не был получен от оператора, в этом случае нельзя точно сказать, было сообщение доставлено или нет). ',
		'3'=>'Просрочено (возникает, если время "жизни" сообщения истекло, а оно так и не было доставлено получателю, например, если абонент не был доступен в течение определенного времени или в его телефоне был переполнен буфер сообщений). ',
		'20'=>'Невозможно доставить (попытка отправить сообщение закончилась неудачно, это может быть вызвано разными причинами, например, абонент заблокирован, не существует или на его номер не поддерживается отправка сообщений). ',
		'21'=>'Неизвестный статус (может возникнуть в случае внутренней ошибки или появления нового статуса на SMS-центре). ',
		'22'=>'Неверный номер (неверный формат номера телефона). ',
		'23'=>'Запрещено (возникает при срабатывании спам фильтра, также запрещается рассылка нецензурных и оскорбительных сообщений и сообщений с запрещенным именем отправителя (Sender ID)). ',
		'24'=>'Недостаточно средств (на счету Клиента недостаточная сумма для отправки сообщения).',
		);}
		{static $SmsSuccErr=array(//Ошибка статуса на стороне оператора
	'0'=>'Нет ошибки.	Абонент существует и доступен. ',
	'1'=>'Абонент не существует.	Указанный номер телефона не существует. ',
	'6'=>'Абонент отсутствует.	Телефон абонента отключен или находится вне зоны действия сети. ',
	'11'=>'Нет услуги SMS.	Означает, что абонент не может принять SMS-сообщение. Например, услуга не подключена, или абонент находится в роуминге, где не активирован прием сообщений, или у оператора абонента не налажен обмен SMS с текущим роуминговым оператором. Также это может быть городской номер без приема сообщений. ',
	'13'=>'Абонент заблокирован.	Возникает, например, если на счету абонента нулевой или отрицательный баланс, и он находится в роуминге, или заблокирован оператором за продолжительную неуплату либо добровольно самим абонентом. Также данная ошибка может возвращаться при повреждении SIM-карты либо неправильном вводе PIN и PUK-кодов SIM-карты. ',
	'21'=>'Нет поддержки SMS.	Аппарат абонента не поддерживает прием SMS-сообщений. ',
	'247'=>'Превышен лимит сообщений.	Превышен общий суточный лимит сообщений, указанный Клиентом в личном кабинете в пункте "Настройки". ',
	'248'=>'Неподдерживаемый номер.	Означает, что на данный номер отправка сообщений заблокирована в нашем сервисе. Например, ввели несуществующий мобильный код, либо для указанного номера нет рабочего SMS-шлюза. ',
	'249'=>'Неверный формат номера.	Возникает, когда мобильный код указанного номера и соответствующая этому коду длина номера неверны. ',
	'250'=>'Номер запрещен настройками.	Номер попал под ограничения, установленные Клиентом для мобильных номеров в личном кабинете в пункте "Настройки". ',
	'251'=>'Превышен лимит на один номер.	Превышен суточный лимит сообщений на один номер. Лимит устанавливается Клиентом в личном кабинете в пункте "Настройки". Также такая ошибка возможна при отправке более 50 сообщений одному абоненту, которые были отправлены с перерывом между сообщениями менее 2-х минут. ',
	'252'=>'Номер запрещен.	Возникает, например, при попытке указания Клиентом одного из наших федеральных номеров в качестве получателя SMS-сообщения. ',
	'253'=>'Запрещено спам-фильтром.	Данная ошибка возникает, например, если текст сообщения содержит нецензурные выражения и оскорбления, призывы отправить sms и некоторые другие запрещенные тексты. ',
	'254'=>'Запрещенный sender id.	Запрещено указывать в качестве отправителя короткие платные номера, номер получателя сообщений, а также названия операторов, чужих интернет-ресурсов, компаний и государственных организаций.
	 Также данная ошибка возникает при попытке отправки от незарегистрированного имени отправителя. ',
	'255'=>'Отклонено оператором.	Оператор отклонил сообщение без указания точного кода ошибки.
	Такое бывает, например, когда номер не принадлежит ни одному мобильному оператору, т.е. с несуществующим кодом, либо по какой-то другой причине оператор не может доставить сообщение.'
	);}
		//открываем сокет к http://www.example.loc на 80-й порт с таймаутом в 30 секунд
		$socket = fsockopen('smsc.ru', 80, $errno, $errstr, 30);

		//если fsockopen вернула false, то завершаем работу скрипта и выводим текст и номер ошибки
		if(!$socket)die("$errstr($errno)");

		//собираем данные
		$data = 'login='.urlencode(SMS_LOGIN).
		'&psw='.md5(SMS_PASS).
		'&id='.urlencode($insId);
		 switch($type)
		{
			case'snd':$data.=
				'&phones='.urlencode($num).
				'&mes='.urlencode($mess).
				'&sender=mobi03.ru&charset=utf-8';
			break;
			case'gst':
			$data.=
				'&fmt=1'.urlencode($num);
			break;
		}
		echo $data;
		//пишем в сокет метод, URI и протокол
		fwrite($socket, "POST /sys/send.php HTTP/1.1\r\n");
		//а также имя хоста
		fwrite($socket, "Host: smsc.ru\r\n");

		//теперь отправляем заголовки
		//Content-type должен быть applicaion/x-www-form-urlencoded
		fwrite($socket,"Content-type: application/x-www-form-urlencoded\r\n");
		//размер передаваемых данных передаем в заголовке Content-length
		fwrite($socket,"Content-length:".strlen($data)."\r\n");
		//типы принимаемых данных. */* означает, что принимаем все типы данных
		fwrite($socket,"Accept:*/*\r\n");
		//представимся оперой
		fwrite($socket,"User-agent:Opera 10.00\r\n");
		fwrite($socket,"Connection:Close\r\n");
		fwrite($socket,"\r\n");

		//теперь передаем данные
		fwrite($socket,"$data\r\n");
		fwrite($socket,"\r\n");

		//теперь читаем и выводим ответ
		$answer = '';
		while(!feof($socket)){
			$answer.= fgets($socket, 4096);
		}
		//закрываем сокет
		fclose($socket);
		//echo $answer;
		if(preg_match("@ERROR = (\d+) \((.+)\)@",$answer,$res))//Ошибка
		{
			$err=$res;
			return false;
		}
		 switch($type)
		{
			case'snd':
				if(preg_match("@OK - (\d+) SMS, ID - (\d+)@",$answer,$res))//Ошибка
					return $res;
			break;
			case'gst':

			break;
		}

	}	
}